﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Helena.Models;
using Helena.Areas.Productos.Models;
using Helena.Areas.Campanas.Models;

namespace Helena.Areas.Categorias.Models
{
    public class LogicaCategoria : InterfazLogicaCategoria
    {
        DBContext Categoria_contexto = new DBContext();
        DBGenericQueriesUtil<Categoria> Tabla;
        DBGenericQueriesUtil<Campana> q_campana;
        DBGenericQueriesUtil<Producto> q_producto;

        public DBContext context_publico { get { return Categoria_contexto; } }

        public LogicaCategoria()
        {
            Tabla = new DBGenericQueriesUtil<Categoria>(Categoria_contexto, Categoria_contexto.t_Categorias);
            q_campana = new DBGenericQueriesUtil<Campana>(Categoria_contexto, Categoria_contexto.t_Campanas);
            q_producto = new DBGenericQueriesUtil<Producto>(Categoria_contexto, Categoria_contexto.t_Productos); 
        }


        public void i_AgregarCategoria(CategoriaView c_v)
        {
            Tabla.agregarElemento(c_v.deserializa(this));
        }

        public void i_ModificarCategoria(CategoriaView c_v)
        {
            Categoria c = c_v.deserializa(this);
            Tabla.modificarElemento(c, c.ID);
        }

        public void i_EliminarCategoria(int id)
        {
            Tabla.eliminarElemento_logico(id);
        }

        public List<CategoriaView> i_RetornarCategorias()
        {
            List<Categoria> c = Tabla.retornarTodos();
            List<CategoriaView> c_v = new List<CategoriaView>();

            foreach (Categoria categoria in c) c_v.Add(new CategoriaView(categoria));
            return c_v;
        }

        public CategoriaView i_RetornarCategoria(int id)
        {
            Categoria c = Tabla.retornarUnSoloElemento(id);
            CategoriaView c_v = new CategoriaView(c);
            return c_v;
        }

        #region Productos

        public List<ProductoView> productos_x_categoria(int ID_Categoria)
        {
            Categoria cat = Tabla.retornarUnSoloElemento(ID_Categoria);
            List<Producto> p = cat.productos.ToList();
            List<ProductoView> p_v = new List<ProductoView>();

            foreach (Producto p_v_x in p) if (p_v_x.Estado)
                {
                    ProductoView p_v_v = new ProductoView(p_v_x);
                    p_v.Add(p_v_v);
                }
            return p_v;
        }

        public List<ProductoView> productosRestantes(string text, int ID_Categoria)
        {
            List<Producto> usados = new List<Producto>();
            List<Producto> relacion = Tabla.retornarUnSoloElemento(ID_Categoria).productos.ToList();

            foreach (Producto p in relacion) usados.Add(q_producto.retornarUnSoloElemento(p.categoria.ID));
            List<Producto> resta;
            if (text != null)
                resta = Categoria_contexto.t_Productos.Where(p => (p.Descripcion.StartsWith(text) && p.Estado)).ToList();
            else
                resta = q_producto.retornarTodos();
            foreach (var p in usados) resta.Remove(p);
            List<ProductoView> salida = new List<ProductoView>();
            foreach (var p in resta) if (p.Estado) salida.Add(new ProductoView(p));
            return salida;
        }

        public void agregarProductoACategoria(int id, ProductoView pv)
        {
            DBContext context = Categoria_contexto;
            Producto p_c = new Producto();

            IEnumerable<Producto> ans = from producto in q_producto.retornarTodos()
                                        where producto.ID == pv.ID && producto.categoria.ID == id
                                        select producto;
            List<Producto> query = ans.ToList();
            if (query.Count != 0)
            {
                pv.ID = query.ElementAt(0).ID;
                modificar_producto(id, pv);
                return;
            }


            p_c.precioventa = pv.precioventa;// double.Parse(ppv.precio_unitario, CultureInfo.InvariantCulture);
            p_c.preciofabrica = pv.preciofabrica;
            p_c.categoria = Tabla.retornarUnSoloElemento(id);
            p_c.campana = q_campana.retornarUnSoloElemento(pv.campanaID);
            DBGenericQueriesUtil<Producto> producto_agregar = new DBGenericQueriesUtil<Producto>(context, context.t_Productos);
            producto_agregar.agregarElemento(p_c);
        }

        internal void modificar_producto(int id_proveedor, ProductoView producto)
        {
            DBContext context = Categoria_contexto;
            Producto p = q_producto.retornarUnSoloElemento(producto.ID);
            p.preciofabrica = producto.preciofabrica;//double.Parse(producto.precio_unitario, CultureInfo.InvariantCulture);
            p.precioventa = producto.precioventa;
            DBGenericQueriesUtil<Producto> query_producto = new DBGenericQueriesUtil<Producto>(context, context.t_Productos);
            query_producto.modificarElemento(p, p.ID);
        }

        internal void eliminar_producto(int id_proveedor, ProductoView producto)
        {
            DBContext context = Categoria_contexto;
            Producto p = q_producto.retornarUnSoloElemento(producto.ID);
            q_producto.eliminarElemento(p.ID);
        }

        internal ProductoView producto_categoria(int id_product)
        {
            var ans = q_producto.retornarUnSoloElemento(id_product);
            return new ProductoView(ans);
        }
        #endregion

    }
}